2.【经典CNN架构】ResNet 论文精读

约 2675 字大约 9 分钟...

2.【经典CNN架构】ResNet 论文精读

原文链接:Deep Residual Learning for Image Recognitionopen in new window

0. 核心总结

核心是提出了一种残差结构,极好地解决了网络精度随着深度的增加而下降的问题,使得可以通过堆叠层数的方式来提升精度。

1. 摘要

更深的神经网络更难训练,本文提出了一个残差学习框架,以减轻深层神经网络训练的难度。本文将网络的层重构为引入层输入的可学习残差函数,代替了之前为引入层输入的函数。

本文提供了全面的实验证明这些残差网络更容易优化,并且能够从大幅增加的深度中获得准确率增益。在ImageNet数据集上,本文测试了152层的残差网络(比VGG网络深8倍,但具有更低的复杂度),在测试集上达到了3.57%的误差,这个结果赢得了ILSVRC 2015分类任务的第一名。本文也在CIFAR-10数据集上展示了100层和1000层残差网络的分析结果。

网络的深度对于许多视觉识别任务来说是非常重要的,仅仅由于本文实现了极深网络的训练,本文在COCO目标检测数据集上获得了28%的相对提升。深度残差网络也是作者在ImageNet检测、ImageNet定位、COCO检测和COCO分割任务上取得第1名的基础。

2. 引言

卷积神经网络的深度是非常重要的,之前在ImageNet数据集上取得领先结果的经典模型都从深度上受益,但是现在深度卷积神经网络正面临臭名昭著的梯度消失/爆炸问题。

虽然这个问题目前可以通过Normalization来解决,但却又出现了退化问题:随着网络深度的增加,精度达到饱和,然后迅速退化,即更深的网络精度反而下降。这种退化并不是由过拟合引起的,因为训练误差同样增高,实验结果如下图:

不同层数卷积神经网络的训练和测试误差
不同层数卷积神经网络的训练和测试误差

根据朴素的直觉,即使更深的网络的深层部分“什么都不做”,即输出是输入的恒等映射,深层网络起码也不应该比浅层网络的误差高,但这样的实验结果表明目前的优化器找不到这样的解。

因此,本文引入了一个残差块来解决退化问题,如下图所示,残差块的核心是通过一个捷径连接(Shortcut Connections,或叫做残差连接)跳过一层或多层卷积将输出增加到层的输出中,添加一个输入的恒等映射。

用数学公式表达,即我们希望让卷积层拟合一个残差映射 F(x)+xF(x)+x ,而不是原映射 F(x)F(x) ,因为通过实验发现卷积层这样的非线性层很难拟合一个恒等映射,所以我们直接增加一个恒等映射。

残差块结构示意图
残差块结构示意图

通过在ImageNet数据集上的全面实验表明:

  1. 本文的深度残差网络更易于优化,相比简单堆叠的“普通网络”有更低的训练误差;
  2. 本文的深度残差网络可以很容易得从大幅增加的深度中获得精度增益,产出的结果明显优于以前的网络。

本文也在CIFAR-10数据集上做了同样的测试,得到了同样的优异的精度表现,并探索训练了超过1000层的模型。

本文训练的152层残差网络在ImageNet测试集上取得了3.57%的top-5误差,同时仍比VGG网络有更低的复杂度,赢得了ILSVRC 2015分类竞赛的第一名;极深的网络在其它识别任务上也具有出色的泛化性能,在ILSVRC和COCO 2015竞赛中进一步获得第1名(ImageNet检测、ImageNet定位、COCO检测和COCO分割)。这表明残差学习的原理具有普适性,它在其他视觉和非视觉问题中也是同样适用的。

3. ResNet网络细节

3.1 如何增加残差连接

在数学公式上,残差块的定义如下:

y=F(x,{Wi})+x y = F(x,\{W_i\}) + x

其中, x,yx,y 分别为层的输入和输出向量,函数 F(x,{Wi})F(x,\{W_i\}) 表示要学习的残差映射。

例如,对于上一幅图所示的两层残差块, F=W2ReLU(W1x)F = W_2 \cdot ReLU(W_1x) ,为了简化表示此处省略了偏差(Bias)。接着,残差连接通过 F+xF + x 操作逐元素相加来实现,相加后再通过一层ReLU输入下一个残差块。

此外需要注意,在等式中 xxFF 的维度必须相等,若不相等则可以通过一个线性投影 WsW_s 来匹配维度,如下式:

y=F(x,{Wi})+Wsx y = F(x,\{W_i\}) + W_s x

此外,以上公式符号为了简单起见表示的是全连接层,但对于卷积层同样也是使用的,函数 F(x,{Wi})F(x,\{W_i\}) 可以表示多个卷积层,逐元素相加在卷积层上即逐通道相加,线性映射在卷积层中一般通过一个1×1的卷积核来实现维度匹配。

3.2 网络架构

下图展示了34层的ResNet架构,并与34层的“普通”网络及VGG-19的结构对比:

ResNet-34架构与其它架构的对比
ResNet-34架构与其它架构的对比

下表给出了ResNet架构的更多细节及更多变体:

ResNet不同架构的配置
ResNet不同架构的配置

其中,对于50层以上的深层网络,为了降低其计算复杂度,本文设计了一种瓶颈架构(Bottleneck),如下图所示。即先通过一个1×1的卷积先降低维度,再通过具有较小输入和输出维度的3×3卷积瓶颈,最后再通过一个1×1的卷积恢复维度。通过这样的瓶颈设计可以有效地减少模型的参数两和复杂度。

Bottleneck示意图
Bottleneck示意图

3.3 网络训练细节

  1. 数据增强:对图像的短边在[256,480]中随机采样进行尺度缩放;对图像或其随机翻转进行224×224的随机剪裁采样,并减去每个像素的均值;标准颜色增强。
  2. 在每次卷积之后、激活之前采用批归一化(Batch Normalization)。
  3. 初始化权重从头开始训练,使用SGD优化器,批大小(Batch Size)为256;学习率从0.1开始,当loss不再下降时除以10;最多训练 60×10460 \times 10^4 个迭代(iteration);权重衰减(Weight Decay)为0.0001,动量(Momentum)为0.9;不使用Dropout。
  4. (为了刷榜,没多大必要)在测试时采用标准的10-crop测试,为了获得最佳结果,采用全卷积网络形式,并在多尺度图像上取平均精度(对图像的短边进行缩放在{224,256,384,480,640}中取值)。

4. 实验与结果

本文在由1000个类组成的ImageNet-2012分类数据集上进行评估。模型在128万张训练集图像上进行训练,在5万张验证集图像上进行测试,得到top-1和top-5错误率。

下表对比了不同层数的ResNet和普通网络在ImageNet验证集上的Top-1误差:

ResNet和普通网络的对比
ResNet和普通网络的对比

下图展示了它们在训练过程中的训练/验证误差:

ResNet和普通网络的训练过程
ResNet和普通网络的训练过程

上述图表结果均表明,普通网络的精度随着深度的增加反而会退化,而ResNet则可以从增加的深度中获得精度增益,同时可以发现,ResNet的收敛速度会比普通网络更快。

本文还研究了三种恒等映射方式:

  1. A:使用补零的方式来实现维度匹配;
  2. B:不同维度则使用线性投影来实现维度匹配,相同维度则直接相加;
  3. C:不论维度是否匹配均使用线性投影。

实验结果如下表所示,下表为10-crop测试结果,可以发现C略优于B,优于A,但使用C会导致参数量和复杂度过大,所以接下来的实验均采用B方案。

不同网络架构的10-crop测试结果
不同网络架构的10-crop测试结果

此外,上表还展示了ResNet-50/101/152三种深层ResNet架构的测试结果,可以发现没有出现退化现象,均从深度中获得了精度增益。

下表展示了单模型的测试结果,得到的结论是相同的。

不同网络架构的单模型测试结果
不同网络架构的单模型测试结果

此外,上述两个测试结果表均展示与之前SOTA单模型的对比结果,可以发现ResNet-50就由于之前所有的SOTA单模型。

本文还将6个不同深度的ResNet模型进行集成(两个152层,其余深度各一个),这个集成模型的精度最优,在ILSVRC 2015竞赛中取得了第一名,测试结果如下表所示,下表为与ImageNet测试集上排名前5的模型的对比结果:

与ImageNet测试集排名前5的模型的对比结果
与ImageNet测试集排名前5的模型的对比结果

5. 个人思考

此前的卷积神经网络架构一直在追求更深的深度,因为能够从增加的深度中获得精度增益,但当深度到了某一界限,更深的层非但没有起作用,反而起了副作用,出现了梯度消失/爆炸的现象。

本文揭示了发生这种现象的本质原因是由于我们目前的优化器很难去优化到一个恒等映射,即输出对于输入总会发生一定程度的偏移,随着深度的增加,这种偏移会离最优解越偏越远,因此本文将前几层输入信息引入下一层,增加了下一层输入恒等映射的权重,让下一层有选择拟合恒等映射的空间。

个人的另一种理解是,神经网络的深层神经元会“遗忘”神经网络浅层的特征信息,所以需要通过不断加入浅层信息的方式去“提醒”深层的神经元这个输入的底层特征,来帮助深层神经元做出更优的推断。

上次编辑于:
贡献者: lisenjie757
已到达文章底部,欢迎留言、表情互动~
  • 赞一个
    0
    赞一个
  • 支持下
    0
    支持下
  • 有点酷
    0
    有点酷
  • 啥玩意
    0
    啥玩意
  • 看不懂
    0
    看不懂
评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v2.14.9